/*
? https://github.com/Sunny-117/js-challenges/issues/149
 */

class Scheduler {
    constructor(max) {
        this.max = max
        this.queue = []
        this.count = 0
    }
    add(fn) {
        //? 添加队列
        this.queue.push(fn)
        //? 调用run函数
        this.run()
    }
    run() {
        //? 并发限制判断
        if (this.max <= this.count || this.queue.length === 0) return
        //? 没达到并发限制 执行fn函数 使用finally等待结果返回后去掉此任务
        this.count++
        //? finally将会等待前面完成后执行，并发数减少，继续处理下一个fn
        Promise.resolve(this.queue.shift()()).finally(() => {
            this.count--
            this.run()
        })
    }
}
// 延迟函数
const sleep = time => new Promise(resolve => setTimeout(resolve, time));

// 同时进行的任务最多2个
const scheduler = new Scheduler(2);

// 添加异步任务
// time: 任务执行的时间
// val: 参数
const addTask = (time, val) => {
    scheduler.add(() => {
        return sleep(time).then(() => console.log(val));
    });
};

addTask(1000, '1');
addTask(500, '2');
addTask(300, '3');
addTask(400, '4');
